﻿//======================================================================
/// COPYRIGHT CATT
/// @file        tv_dsp2fpga.h
///
/// @brief       tv_dsp2fpga.cpp 的头文件
/// @author      jiayoupeng
/// @note        暂无
/// @par History
/// -
///       Date|       Author|        Version|        DESCRIPTION
/// ----------|-------------|---------------|-------------------
/// 2018-12-12|   jiayoupeng|          0.0.1|            created
//======================================================================
#ifndef _TV_DSP2FPGA_
#define _TV_DSP2FPGA_
//#include "../CommLib_FltC/Lib_Arith_f.h"
#include "../CommLib_FltC/GlobalVarDef.h"
//#include "../CommLib_FltC/Common_function.h"
#include "../CommLib_FxpC/lib_arith_N.h"
//#include "../gNB/PUSCH_FltC/FilePrintf.h"
//#include "../UE/PDSCH_CHE_FxpC/ue_rx_pdsch_che_fxp.h"
//#include "../UE/PDSCH_CHE_FltC/ue_rx_pdsch_che_f.h"
#include "../UE/PDSCH_MIMO_FltC/ue_rx_pdsch_mimo_f.h"
#include "../CommLib_FltC/ldpc_cc_f.h"
#include "math.h"


extern uint32    FPGAParaReg[100];
extern uint32    RegIndex;
extern uint8     C_SequRe[12][4][MAXRBNUM * 6];
extern uint8     C_SequIm[12][4][MAXRBNUM * 6];
extern uint32    C_Ini_X2_DMRS[12][4][32];
extern uint32    C_Ini_X1_DMRS[12][4][32];

void mk_tv_file();
uint32 PDSCH_DMRS_PARA0(stParamChe *pstParamTable);
uint32 PDSCH_DMRS_PARA4_11(stParamChe *pstParamTable, int BitMap[137], int BundNum, int16 SpecBundPos[2], int16 SpecBundType[2], int16 BundlStart, int16 BundlEnd);
uint32 PDSCH_DMRS_PARA13_15(stParamChe *pstParamTable);
void PDSCH_Bit_Print(stLDPCParamTable  *pstParamTable);
void PDSCH_DMRS_PARA_PRINT();
void PDSCH_Descramble_Cinit(stParam_mimo      *pstParamTable);


void PDSCH_DMRS_LS_TFT_DATA_TV_PRINT(stParamChe *pstParamTable, cmplx_frN *pcsRxData[MAX_RX_ANT_NUM][MAXSYMNUM], UINT16 i, UINT16 p, UINT16 usSlotInd, UINT16 usSymbIndex, char *str);
void PDSCH_DMRS_LS_PnSequ_Cini_TV_PRINT(stParamChe *pstParamTable, UINT16 i, UINT16 ucTxAntPort, UINT16 l);
void PDSCH_DMRS_LS_CHE_TV_PRINT(stParamChe *pstParamTable, cmplx_frN  *acsRsData[MAX_RX_ANT_NUM][MAX_TX_ANT_NUM][MAX_RS_SYM_NUM], cmplx_frN pcsH, cmplx_frN *acsRs[MAX_TX_ANT_NUM][MAX_RS_SYM_NUM], UINT16 i, UINT16 ucTxAntPort, UINT16 l, UINT16 k, int u16_m);
void PDSCH_DMRS_LS(stParamChe *pstParamTable, int BitMap[137], int *BundNumOut, int16 SpecBundPos[2], int16 SpecBundType[2], int16 SpecBundRBNum[2], int16 *BundlStartOut, int16 *BundlEndOut);
void PDSCH_DMRS_LS_TV_PRINT(stParamChe *pstParamTable, int BitMap[137], int BundNumOut, int16 SpecBundPos[2], int16 SpecBundType[2], int16 BundlStartOut, int16 BundlEndOut);
#if 1
typedef struct
{
    uint32 TASK_TIME_START_SYMBOL;      /* 4'0x0  CORESET0时域起始位置，取值0-13 */
    uint32 CORESET_VALID_BITMAP;        /* 3'0x0  Bit12置1表示CORESET0参数有效
                                                Bit13置1表示CORESET1参数有效
                                                Bit14置1表示CORESET2参数有效；无效则置0 */
    uint32 TASK_CORESET_NUM;            /* 2'0x0  UE在当前任务下有效的 CORESET个数，取值1-3 */
    uint32 PDCCH_TASK_FEED_BACK_IND;    /* 1'0x0  是否反馈DCI信息，1-上报，0-不上报，若这个任务有正确的DCI，固定上报中断 */
    uint32 PDCCH_TASK_CANDIDATE_NUM;    /* 6'0x0  UE在当前任务下需要盲检的 PDCCH总次数（包括所有CORESET的），取值1-36 */
    uint64 CORESET_CANDIDATE_BITMAP[MAX_CORESET_NUM];/* 45'0x0 CORESET×含有的pdcch candidate的bitmap，
                                                低位bit0表示下面pdcch bit级参数candidate_0，
                                                bit1表示candidate_1，依此类推到bit44 */
    uint32 CORESET_CANDIDATE_NUM[MAX_CORESET_NUM];      /* 6'0x0  CORESET×_CANDIDATE_BITMAP中bit值为1的总个数，
                                                即本coreset含有的pdcch candidate总个数，取值为0-36 */  
    uint32 CORESET_C_INIT_SYMBOL[MAX_CORESET_NUM][3];    /* 32'0x0 CORESET中第1、2、3个符号的DMRS伪随机序列X2的初始值，实际低31比特有效 */
}pdcch_task_fpga_Table;


typedef struct
{
    uint32 CORESET_FRE_DOM[2];          /* 45'0x0 CORESET频域bitmap配置 */
    uint32 CORESET_FRE_RB_NUM;          /* 9'0x0  CORESET_FRE_DOM中bit值为1所占的频域RB总个数 */
    uint32 CORESET_FRE_BIT1_NUM;        /* 6'0x0  CORESET_FRE_DOM中bit值为1的总个数 */
    uint32 CORESET_ID;                  /* 4'0x0  CORESET ID号下标，取值0-11 */
    uint32 CORESET_INTERLEAVER_PARA_C;  /* 8'0x0  CORESET交织参数C，取值1-135 */
    uint32 CORESET_INTERLEAVER_SIZE;    /* 3'0x0  CORESET中交织颗粒度R，取值2，3，6 */
    uint32 CORESET_N_SHIFT_REMAIN;      /* 9'0x0  CORESET循环移位索引nshift 模 REG BUNDLE总数的余数 */
    uint32 CORESET_REG_BUNDLE_SIZE;     /* 3'0x0  CORESET中bundle的大小L，取值2，3，6 */
    uint32 CORESET_REG_BUNDLE_NUM;      /* 9'0x0  CORESET中REG BUNDLE的总个数，取值1-270 */
    uint32 CORESET_CCE_REG_MAP_TYPE;    /* 1'0x0  CORESET CCE到REG的交织
                                                  0：不交织
                                                  1：交织 */
    uint32 CORESET_TIME_DURATION;       /* 2'0x0  CORESET时域符号个数，取值1-3 */
    uint32 REG_BUNDLE_RB_NUM;           /* 3'0x0  一个REG BUNDLE在频域上占有的RB个数，取值1，2，3，6 */
    uint32 MRC_IRC_FLAG;                /* 1'0x0  MRC/IRC开关，0：MRC  1：IRC，目前固定写0为MRC */
    uint32 TX_RX_MODE;                  /* 1'0x0  发射天线和接收天线类型，0：单发单收 1：单发双收 */
    uint32 N_PDCCH_SHIFT;               /* 4'0x0  PDCCH软值的移位因子，取值范围暂定为-8~+7,当前取值为4 */
    uint32 FRE_COEF_QCL_FLAG;           /* 1'0x0  CORESET的频域滤波系数与哪个结果进行QCL，
                                                  取值0：与SSB进行QCL；1：与TRS进行QCL，目前固定写0不做QCL */
    uint32 CORESET_BUNDLE_FLAG;         /* 1'0x0  CORESET是否采用bundle内滤波，当前默认为采用，强制配置为1 */
    uint32 CORESET_FRE_RB_OFFSET;       /* 9'0x0  CORESET频域起始位置偏移量,0-272 */
    uint32 LOCAL_DMRS_OFFSET;           /* 9'0x0  local DMRS基准为coreset0时，则该值填零，否则填coreset freq bitmap中第一个bit的起始RB相对CRB0的偏移量 */
  
}pdcch_coreset_fpga_Table;

typedef struct
{
    uint32 RNTI_0;                      /* 16'h0000 RNTI_0 */
    uint32 RNTI_1;                      /* 16'h0000 RNTI_1 */
    uint32 RNTI_2;                      /* 16'h0000 RNTI_2 */
    uint32 RNTI_3;                      /* 16'h0000 RNTI_3 */
    uint32 X2;                          /* 32'h0000 Cinit经过1600次迭代后的X2, 实际低31比特有效 */
    uint32 N_softbit_num_index;         /* 3'h00  Polar译码器输入软比特长度，取值{1, 2, 4}分别对应软比特长度为{128, 256, 512} */
    uint32 K;                           /* 8'h00  Payload长度 */
    uint32 bit_sel_mode;                /* 3'h00  解比特选择模式（解打孔、解shorten、解重复）
                                          001：DE_REPEAT
                                          010：DE_PUNC
                                          100：DE_SHORTEN */
    uint32 AL_LOG2;                     /* 3'b000 0,1,2,3,4对应聚合等级1,2,4,8,16 */
    uint32 sub_matrix_column_num;       /* 6'h00  Candidate在交织矩阵中所占的列数：
                                                (bundle_num+start_bundle_idx-1)/R - c_start + 1,取值 1~48 */
    uint32 start_bundle_idx;            /* 9'h000 candidate 对应的起始bundle index,0~270 */
    uint32 AL8_EXTEND_AL16_FLAG;        /* 1'b0     当CORESET为非交织模式，且CORESET时域符号大于1时，
                                                  当此candidate的CCE AL=8与CCE AL = 16的起始CCE index相同时，
                                                  则将CCE AL=8此标志置1，其它情况均置为0。 */
    uint32 vld_RNTI_num;                /* 3'b000 有效的RNTI个数n，1，2，3，4,默认前n个有效 */
    uint32 sub_matrix_index_start_j0;   /* 9'h000 candidate对应的子矩阵中起始bundle index(交织前编号),
                                                  即(0,c_staart)元素对应的交织前index, 取值为c_start*R, 0~270 */
    uint32 sub_matrix_index_start_fj0;  /* 9'h000 candidate对应的子矩阵中起始bundle index(交织后编号),
                                                  即(0,c_staart)元素对应的交织后index，
                                                  取值为c_start= start_bundle_idx /R(交织的行数), 0~270 */
}pdcch_candidate_fpga_Table;


typedef struct
{
    uint32 SLOT_ID_IN_FRAME;      /* 8'0x0  一帧中的时隙号，取值0-19（简化方案只支持30khz） */
    uint32 UE_PDCCH_TASK_NUM;     /* 3'0x0  UE在当前SLOT下需要调度的任务次数，取值1-4 */
    uint32 FRE_COEF_BUFFER_IND;   /* 1'0x0  频域滤波系数buffer指示，取值范围[0,1]，
                                          分别对应频域滤波ping buffer和pang buffer（简化方案固定配置为0） */
    uint32 UE_PDCCH_CANDIDATE_NUM;/* 6'0x0  UE在当前SLOT下需要盲检的 PDCCH次数，取值1-36 */
    uint32 PDCCH_CFG_READY;       /* 1'0x0  FPGA内部监控此bit位，用来进行参数拷贝。
                                           1:表示DSP本时隙参数配置完成
                                           0：表示FPGA空闲，DSP可以配置参数 */
    pdcch_task_fpga_Table      PDCCH_TASK_PARM[4];
    pdcch_coreset_fpga_Table   PDCCH_CORESET_PARM[MAX_CORESET_NUM];
    pdcch_candidate_fpga_Table PDCCH_CANDIDATE_PARM[44];

}pdcch_fpga_para_Table;

typedef struct
{
    uint32 PDCCH_SLOT_PARM;              /* 时隙级参数 */
    uint32 PDCCH_SLOT_NUM;              /* 时隙号 */
    uint32 PDCCH_TASK_PARM[4][16];       /* 任务级参数 */
    uint32 PDCCH_CORESET_PARM[3][4];     /* CORESET级参数 */
    uint32 PDCCH_CANDIDATE_PARM[44][6];  /* PDCCH BIT级参数 */

} pdcch_fpga_reg_Table;

extern uint32   g_dci_result[5];
extern uint32   g_pdcch_cnt;
extern pdcch_fpga_reg_Table  st_fpga_reg;
extern pdcch_fpga_para_Table st_fpga_para;
extern uint32   struc_size;
extern FILE     *fpout_pdcch_output;

extern void PDCCH_PARA(OUT pdcch_fpga_reg_Table  *stp_fpga_reg,
	                   IN  pdcch_fpga_para_Table *stp_fpga_para);
#endif

#endif
